#ifndef _SENSOR_BOARD_H_
#define _SENSOR_BOARD_H_

#include <config.h>
#include <stdbool.h>

// 传感器去抖动等待时间   - 20ms
#define SENSOR_DEBOUNCE_WAIT_TIME                 (20ul)
// 钥匙触发重置需要得时间 - 10 * 2 = 20s
#define KEY_RESET_WAIT_TIME                       (10ul)

// 霍尔检测管脚
#if _HALL_SENSOR_ENABLE_
#if _BOARD_TYPE_ == _V32_A_BOARD_
#define HALL_SENSOR_PIN                           GPIO_Pin_1
#endif

/**
 * @brief 霍尔传感器状态位
 *
 */
typedef struct
{
  uint8_t HallSensorTiggerEn   : 1; // 触发中断标识
  uint8_t Reserved             : 7; // 保留
} HallSensorBitStatus_t;
#endif

#if _ANTI_SKID_DETECTION_ENABLE_

#if _BOARD_TYPE_ == _V33_A_BOARD_
#define ANTI_PRYING_PIN                           GPIO_Pin_0

#elif _BOARD_TYPE_ == _V33_B_BOARD_
#define ANTI_PRYING_PIN                           GPIO_Pin_4

#elif _BOARD_TYPE_ == _V33_C_BOARD_
#define ANTI_PRYING_PIN                           GPIO_Pin_12
#endif

// 提示间隔时间
#define ANTI_PRYING_ALARM_TIP_INTERVAL            (5ul)

/**
 * @brief 假锁状态提示
 *
 */
typedef enum
{
  AUTI_PICK_STEP_IDLE,    // 空闲
  AUTI_PICK_STEP_ALARM,   // 警报
  AUTI_PICK_STEP_LISTER,  // 监听
} AutiPryingHintStatus_t;

/**
 * @brief 撬锁传感器状态位
 *
 */
typedef struct
{
  uint8_t AntiPryingTiggerEn     : 1; // 触发中断标识
  uint8_t AntiPryingAlarmTipEn   : 1; // 警报触发标识
  uint8_t AccumulatedPromptCount : 6; // 提示累计次数

  AutiPryingHintStatus_t AntiPryingHintStep; // 提示状态
} AntiPryingBitStatus_t;

/**
 * @brief 更新防撬警报提示间隔
 *
 * @param Interval - 提示间隔
 */
extern void UpdateAutiPickAlarmTipInterval(uint8_t Interval);
#endif

#if _LOCK_LATCH_DETECTION_ENABLE_

#if _BOARD_TYPE_ == _V31_A_BOARD_
#define LOCK_HEAD_SENSOR_PIN                      GPIO_Pin_7

#elif _BOARD_TYPE_ == _V32_A_BOARD_
#define LOCK_HEAD_SENSOR_PIN                      GPIO_Pin_8

#elif _BOARD_TYPE_ == _V32_B_BOARD_
#define LOCK_HEAD_SENSOR_PIN                      GPIO_Pin_12
#endif

/**
 * @brief 锁舌传感器状态位
 *
 */
typedef struct
{
  uint8_t HeadTongueTiggerEn    : 1; // 触发中断标识
  uint8_t HeadTongueAlarmTipEn  : 1; // 警报触发标识
  uint8_t HeadTongueTiggerCount : 6; // 触发次数
} HeadTongueBitStatus_t;

/**
 * @brief 更新锁舌警报提示间隔
 *
 * @param Interval - 提示间隔
 */
void UpdateKeyInstallAlarmTipInterval(uint8_t Interval);
#endif

#if _SQUARE_LATCH_DETECTION_ENABLE_

#if _BOARD_TYPE_ == _V31_A_BOARD_
#define SQUARE_TONGUE_SENSOR_PIN                  GPIO_Pin_5

#elif _BOARD_TYPE_ == _V32_A_BOARD_
#define SQUARE_TONGUE_SENSOR_PIN                  GPIO_Pin_14

#elif _BOARD_TYPE_ == _V32_B_BOARD_
#define SQUARE_TONGUE_SENSOR_PIN                  GPIO_Pin_8
#endif

/**
 * @brief 反锁提示状态
 * 
 */
typedef enum
{
  DOUBLE_LOCK_STEP_IDLE,    // 空闲
  DOUBLE_LOCK_STEP_WAIT,    // 等待
  DOUBLE_LOCK_STEP_ALARM,   // 警报
} DoubleLockHintStatus_t;

/**
 * @brief 配置方舌警报提示功能
 *
 * @param En - 功能配置位（true：打开 false：关闭）
 */
typedef struct
{
  uint8_t SquareTongueTiggerEn   : 1; // 触发中断标识
  uint8_t SquareTongueAlarmTipEn : 1; // 警报触发标识
  uint8_t SquareTongueHintStep   : 6; // 提示状态
} SquareTongueBitStatus_t;

/**
 * @brief 更新反锁警报提示间隔
 *
 * @param Interval - 提示间隔
 */
extern void UpdateDoubleLockAlarmTipInterval(uint8_t Interval);
#endif

#if _BEVELED_LATCH_DETECTION_ENABLE_

#if _BOARD_TYPE_ == _V31_A_BOARD_
#define INCLINED_TONGUE_SENSOR_PIN                GPIO_Pin_6

#elif _BOARD_TYPE_ == _V32_A_BOARD_
#define INCLINED_TONGUE_SENSOR_PIN                GPIO_Pin_15

#elif _BOARD_TYPE_ == _V32_B_BOARD_
#define INCLINED_TONGUE_SENSOR_PIN                GPIO_Pin_13
#endif

// 开锁后等待斜舌恢复超时 - 30s
#define SENSOR_UNLOCK_AFTER_WAIT_TIME             (30ul)
// 假锁报警间隔时间      - 6s
#define SENSOR_FALSE_LOCK_ALARM_TIME              (6ul)

/**
 * @brief 假锁状态提示
 *
 */
typedef enum
{
  OBLIQUE_STEP_IDLE,    // 空闲
  OBLIQUE_STEP_WAIT,    // 等待
  OBLIQUE_STEP_ALARM,   // 警报
  OBLIQUE_STEP_LISTER,  // 监听
} ObliqueLockHintStatus_t;

/**
 * @brief 斜舌状态位
 *
 */
typedef struct
{
  uint8_t FalseLockTipEn          : 1; // 假锁提示标识
  uint8_t ObliqueTongueTiggerEn   : 1; // 触发中断标识
  uint8_t ObliqueTongueAlarmTipEn : 1; // 警报触发标识
  uint8_t ObliqueLockHintStatus   : 5; // 假锁状态

  uint16_t FalseLockTipCount;        // 假锁提示次数
  uint16_t ObliqueTongueTiggerCount; // 触发次数
} ObliqueTongueBitStatus_t;

/**
 * @brief 更新假锁警报提示间隔
 *
 * @param Interval - 提示间隔
 */
extern void UpdateFalseLockAlarmTipInterval(uint8_t Interval);
#endif

#if _EXIT_BUTTON_DETECTION_ENABLE_

#if _BOARD_TYPE_ == _DA01_A_BOARD_
#define EXIT_BUTTOM_PIN            GPIO_Pin_0

#elif _BOARD_TYPE_ == _EC01_BOARD_
#define EXIT_BUTTOM_PIN            GPIO_Pin_12
#endif

/**
 * @brief 配置出门按钮报提示功能
 *
 */
typedef struct
{
  uint8_t ExitButtonTiggerEn : 1; // 触发中断标识
  uint8_t Reserved           : 7; // 保留
} ExitButtonBitStatus_t;
#endif

/**
 * @brief 获取锁舌触发标识
 *
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool GetHeadTongueTiggerEn(void);

/**
 * @brief 获取假锁触发标识
 *
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool GetFlaseLockAlarmEn(void);

/**
 * @brief 获取斜舌触发标识
 * 
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool GetObliqueLockAlarmEn(void);

/**
 * @brief 获取防撬警报标识
 *
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool GetAntiPickingAlarmEn(void);

/**
 * @brief 获取反锁触发标识
 *
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool GetAntiLockSignalTiggerEn(void);

/**
 * @brief 失能所有传感器
 *
 */
extern void DisableAllSensorInSoucre(void);

/**
 * @brief 使能所有传感器
 *
 */
extern void EnableAllSensorInSoucre(void);

/**
 * @brief 传感器板载功能初始化
 *
 */
extern void SensorBoardInitialisation(void);

#endif
